<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  

  
  <title>面试准备 | 雁过留声</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="redisredis特点script1开源的，基于内存的，key-value型的数据库 redis为什么快script123数据在内存中worker线程为单线程，避免了上下文切换使用了io多路复用    中间件 hsf服务消息队列metaqredis,redis集群,分布式锁 分库分表英语口语 面试简历 redis 基本数据结构Stringlist，不唯一有序set 唯一，无序sorted set">
<meta property="og:type" content="article">
<meta property="og:title" content="面试准备">
<meta property="og:url" content="http://yanglf007.gitee.io/blog/2020/07/20/%E9%9D%A2%E8%AF%95%E5%87%86%E5%A4%87/index.html">
<meta property="og:site_name" content="雁过留声">
<meta property="og:description" content="redisredis特点script1开源的，基于内存的，key-value型的数据库 redis为什么快script123数据在内存中worker线程为单线程，避免了上下文切换使用了io多路复用    中间件 hsf服务消息队列metaqredis,redis集群,分布式锁 分库分表英语口语 面试简历 redis 基本数据结构Stringlist，不唯一有序set 唯一，无序sorted set">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2020-07-19T16:38:16.876Z">
<meta property="article:modified_time" content="2020-08-14T14:47:42.450Z">
<meta property="article:author" content="yanglf007">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/blog/atom.xml" title="雁过留声" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  
<link rel="stylesheet" href="/blog/css/style.css">

<meta name="generator" content="Hexo 4.2.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/blog/" id="logo">雁过留声</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/blog/">Home</a>
        
          <a class="main-nav-link" href="/blog/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/blog/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://yanglf007.gitee.io/blog"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-面试准备" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/07/20/%E9%9D%A2%E8%AF%95%E5%87%86%E5%A4%87/" class="article-date">
  <time datetime="2020-07-19T16:38:16.876Z" itemprop="datePublished">2020-07-20</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      面试准备
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="redis"><a href="#redis" class="headerlink" title="redis"></a>redis</h2><h3 id="redis特点"><a href="#redis特点" class="headerlink" title="redis特点"></a>redis特点</h3><figure class="highlight shell"><figcaption><span>script</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">开源的，基于内存的，key-value型的数据库</span><br></pre></td></tr></table></figure>
<h3 id="redis为什么快"><a href="#redis为什么快" class="headerlink" title="redis为什么快"></a>redis为什么快</h3><figure class="highlight shell"><figcaption><span>script</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">数据在内存中</span><br><span class="line">worker线程为单线程，避免了上下文切换</span><br><span class="line">使用了io多路复用</span><br></pre></td></tr></table></figure>



<p>中间件</p>
<p>hsf服务<br>消息队列metaq<br>redis,redis集群,分布式锁</p>
<p>分库分表<br>英语口语 面试<br>简历</p>
<p>redis</p>
<p>基本数据结构<br>String<br>list，不唯一有序<br>set 唯一，无序<br>sorted set，唯一，排序<br>hash 存储对象</p>
<p>1,Redis 持久化机制</p>
<p>有两种机制，一种是rdb（redis database）,一种是aof（apend only file）<br>rdb机制 有三种方式触发，save,bgsave,自动触发<br>    save命令 redis服务线程阻塞，将内存数据以二进制的方式保存到硬盘上，<br>    bgsave命令 redis 开启一个子线程，fork主线程数据，这时也会阻塞，但是由于在内存中完成，所有速度比较快，fork完成后主线程恢复，子线程将数据同步到硬盘上。如果有备份文件，将新文件替换备份文件<br>    自动触发 save 900 1,300 10,60 10000, 表示多少秒内变动数据多少次 自动触发bgsave<br>aof机制 类似mysql binlog ，每次收到一个写命令都会将命令会将追加的appendonly.aof文件中,aof也有三种触发，always 总是，everysec 每秒，no</p>
<p>rdb 和 aof对比</p>
<p>rdb文件小，系统默认，qps高，恢复速度快，二进制数据文件<br>aof文件大，qps低，恢复速度慢，保存所有写命令的文件<br>rbd容易数据丢失，aof不易丢失</p>
<p>2,缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题</p>
<p>缓存雪崩：大量的key同时过期，导致大量的请求打到数据库上<br>缓存击穿：特定的值进行查询，这时缓存正好过期，导致大量请求落到数据库上（热点数据永不过期，或者对从数据库查询数据加锁）<br>解决方案：从缓存中没有拿到，加锁，从数据库那数据，更新到缓存中，释放锁 ，其他请求拿不到锁，就休眠一段时间，重新调用查询数据接口</p>
<p>缓存穿透：请求不存在的数据，缓存中没有，去查数据库  （缓存中存null值，设置过期时间，不能太长，也不能太短）</p>
<p>即redis的缓存每命中一次,就给命中的缓存增加一定ttl(过期时间)(根据具体情况来设定, 比如10分钟).</p>
<p>一段时间后, 热数据的ttl都会较大, 不会自动失效, 而冷数据基本上过了设定的ttl就马上失效了。</p>
<p>3,热点数据和冷数据是什么</p>
<p>4,Memcache与Redis的区别都有哪些？</p>
<p>一，redis支持数据备份memcache不支持<br>二，value值大小不同，memcache最多1m，redis 512m<br>三，数据类型不同，memcache只有字符串，redis有字符串，list,set，zset,hash等多种类型<br>四，redis比较快，memcache慢</p>
<p>5,单线程的redis为什么这么快<br>6,redis的数据类型，以及每种数据类型的使用场景，Redis 内部结构<br>7,redis的过期策略以及内存淘汰机制【～】<br>定时删除+淘汰删除，没间隔一段时间，随机扫描一些key，有过期key则，删除，get key时，检查key有没有过期，过期删除<br>加入，定期删除没有扫描到，一段时间也没访问，导致key无法被删除， 需要使用内存淘汰策略</p>
<p>volatile-lru：从已设置过期时间的数据集（server.db[i].expires）中挑选最近最少使用的数据淘汰<br>volatile-ttl：从已设置过期时间的数据集（server.db[i].expires）中挑选将要过期的数据淘汰<br>volatile-random：从已设置过期时间的数据集（server.db[i].expires）中任意选择数据淘汰<br>allkeys-lru：从数据集（server.db[i].dict）中挑选最近最少使用的数据淘汰<br>allkeys-random：从数据集（server.db[i].dict）中任意选择数据淘汰<br>no-enviction（驱逐）：禁止驱逐数据，新写入操作会报错<br>volatile-lfu：从已设置过期时间的数据集挑选使用频率最低的数据淘汰。<br>allkeys-lfu：从数据集中挑选使用频率最低的数据淘汰</p>
<p>8,Redis 为什么是单线程的，优点<br>9,如何解决redis的并发竞争key问题<br>10,Redis 集群方案应该怎么做？都有哪些方案？</p>
<p>1，主从模式<br>2，cluster集群模式 16384个槽<br>3,codis集群方案</p>
<p>11,有没有尝试进行多机redis 的部署？如何保证数据一致的？<br>12,对于大量的请求怎么样处理<br>1 缓存预热<br>2 设置过期时间+随机数<br>3 数据散列开</p>
<p>14,讲解下Redis线程模型</p>
<p>15,为什么Redis的操作是原子性的，怎么保证原子性的？<br>16,Redis事务<br>17,Redis实现分布式锁<br>18，如何保证redis中都是热点数据<br>答：有一种简单的缓存失效策略，lru，最近少用淘汰，<br>每命中一次缓存，增加一点的过期时间，比如10分钟，热点数据一般过期时间比较大，不会失效，用的少的数据容易失效</p>
<p>19 redis和数据库双写一致性问题<br>采用延时双删策略<br>先删除缓存，再更新数据库，再更新缓存，设置一个比较短的过期时间<br><a href="https://blog.csdn.net/qq_37779352/article/details/82977921" target="_blank" rel="noopener">https://blog.csdn.net/qq_37779352/article/details/82977921</a></p>
<p>20 redis 怎么实现分布式锁</p>
<p>set key value nx px 3000</p>
<p>23 redis 是单线程还是多线程</p>
<p>一般说redis是单线程，因为文件事件分派器队列的消费是单线程的<br>多线程的方式在后台删除对象</p>
<p>redis6.0上了多线程是指，在网络Io处理上用了多线程，入网络读写，协议解析</p>
<p>布隆过滤器（推荐）解决缓存穿透<br>bit数组，起始值为0，对key进行多个hash算法求值，比如得到10,20,30，这时这个数组的这三个下标的值就为1 ，</p>
<p>一致性hash算法<br>将1 2-31 个数分布到一个hash环上，对redis服务器ip或主机名取hash，确定在环上文字，<br>然后对key取hash，也能确定在环上位置，顺时针走，遇到的第一台服务器就是需要存放的服务器，<br>增加和删除服务器，只会影响一台服务器</p>
<p>hash环数据倾斜问题，可以通过增加虚拟节点解决，节点越多，数据分布越均匀</p>
<p><a href="https://blog.csdn.net/Butterfly_resting/article/details/89668661" target="_blank" rel="noopener">https://blog.csdn.net/Butterfly_resting/article/details/89668661</a></p>
<p>es倒排索引</p>
<p>微服务好处与缺点</p>
<p>优点<br>1）独立可扩展<br>2)独立服务升级<br>3）易维护<br>4）语言无关<br>5）故障隔离 比如内存泄漏，数据库连接未关闭<br>6）与docker方便集成</p>
<p>缺点<br>服务带来的延迟问题</p>
<p>mq重复消费的问题</p>
<p>reentrantLock 和 synchronized 区别</p>
<p><a href="https://blog.csdn.net/qq_40551367/article/details/89414446" target="_blank" rel="noopener">https://blog.csdn.net/qq_40551367/article/details/89414446</a></p>
<p>（1）什么是 CPU 缓存行？<br>缓存是由缓存行组成的，通常是 64 字节（常用处理器的缓存行是 64 字节的，比较旧的处理器缓存行是 32 字节），并且它有效地引用主内存中的一块地址。</p>
<p>一个 Java 的 long 类型是 8 字节，因此在一个缓存行中可以存 8 个 long 类型的变量。<br>（2）什么是内存屏障？</p>
<p>（3）什么是伪共享？<br>当多线程修改互相独立的变量时，如果这些变量共享同一个缓存行，就会无意中影响彼此的性能，这就是伪共享。<br><a href="https://www.cnblogs.com/tong-yuan/p/FalseSharing.html" target="_blank" rel="noopener">https://www.cnblogs.com/tong-yuan/p/FalseSharing.html</a></p>
<p>（4）如何避免伪共享？</p>
<p>@ Contended </p>
<p>Thread.join<br> 调用方线程（调用join方法的线程）执行等待操作，直到被调用的线程（join方法所属的线程）结束，再被唤醒<br><a href="https://www.jianshu.com/p/367fa66bf3f2" target="_blank" rel="noopener">https://www.jianshu.com/p/367fa66bf3f2</a></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/07/20/%E9%9D%A2%E8%AF%95%E5%87%86%E5%A4%87/" data-id="ckgtnonnd000ym8ulfmmc1vhf" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/blog/2020/07/28/java%E5%9F%BA%E7%A1%80/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          java基础
        
      </div>
    </a>
  
  
    <a href="/blog/2020/07/19/%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">双亲委派</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    

  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/10/">October 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/08/">August 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/07/">July 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/06/">June 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/05/">May 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/04/">April 2020</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/blog/2020/10/25/%E6%AF%8F%E6%97%A5%E5%AD%A6%E4%B9%A0/">每日学习</a>
          </li>
        
          <li>
            <a href="/blog/2020/10/12/mybatis-plus/">mybatis-plus</a>
          </li>
        
          <li>
            <a href="/blog/2020/08/30/%E7%A7%92%E6%9D%80%E7%B3%BB%E7%BB%9F/">秒杀系统</a>
          </li>
        
          <li>
            <a href="/blog/2020/08/29/elasticsearch%E7%9F%A5%E8%AF%86/">elasticsearch知识</a>
          </li>
        
          <li>
            <a href="/blog/2020/08/28/redis%E9%9D%A2%E8%AF%95/">redis面试</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2020 yanglf007<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/blog/" class="mobile-nav-link">Home</a>
  
    <a href="/blog/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  
<link rel="stylesheet" href="/blog/fancybox/jquery.fancybox.css">

  
<script src="/blog/fancybox/jquery.fancybox.pack.js"></script>




<script src="/blog/js/script.js"></script>




  </div>
</body>
</html>